package hihocode;

import java.util.Scanner;

// 如果一个字符串恰好包含2个'h'、1个'i'和1个'o',称为hiho字符串
// 找出S的所有子串中，最短的hiho字符串是哪个。
//这道题与最小包含子串类似，但是要注意是恰好，也就是不能多
public class HiHoString {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String string;
		final String match = "hiho";
		while (scanner.hasNext()) {
			string = scanner.nextLine();
			System.out.println(minLength(string, match));
		}
		scanner.close();
	}

	public static int minLength(String str1, String str2) {
		char[] chars1 = str1.toCharArray();
		char[] chars2 = str2.toCharArray();
		// map表示对于chars1而言，还欠chars2字符的个数
		// 比如ababncdbbc abc， map初始就是a -- 1; b -- 1; c -- 1.
		int[] map = new int[256];
		for (int i = 0; i < chars2.length; i++) {
			map[chars2[i]]++;
		}

		// 表示str1的左右边界
		int left = 0;
		int right = 0;

		int match = chars2.length; // 用于表示还未匹配的个数，为0表示全部匹配
		int length = Integer.MAX_VALUE;
		while (right != chars1.length) {
			map[chars1[right]]--; // 详见P292，如果map[chars1[right]]为0就会减成负的
			// 如果减了之后大于等于0，那么就说明chars2中有这个字符，将match减1
			if (map[chars1[right]] >= 0) {
				match--;
			}
			if (match == 0) {
				// 如果match为0，就是说明已经包含了全部，但是不一定是最小的
				// 此时可以移动left,将map中为负的(表示chars2中不含有的)移除
				while (map[chars1[left]] < 0) {
					map[chars1[left++]]++;
				}
				// 将所有的能够清除的清除之后 ，就更新length的值
				// 唯一改变的是这里，由于是恰好，所以一定要为0
				if(map['h'] == 0 && map['i'] == 0 && map['o'] == 0){
					length = Math.min(length, right - left + 1);
				}
				// 因为以left开始的最短子串已经记录了，所以要将left移动一位，并将，match++
				map[chars1[left++]]++;
				match++;
			}
			right++;
		}
		return length == Integer.MAX_VALUE ? -1 : length;
	}
	
}
